﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BIZMA._controls;
using BIZModel;
using BL.BIZControls;
using System.Web.Security;
using BL.BetterControls;
using BIZMA.BL.Security;

namespace BIZMA._controls.Security
{
    public partial class List_SysGroupPermissions : BIZListControl, IBIZControlDefaultMethods
    {
        #region Default
        public void DefaultListLoad()
        {
            throw new NotImplementedException();
        }
        public void DefaultListLoad(Guid Id, string loadByType)
        {
            if (loadByType == ObjectTypeGroup)
                LoadGroupPermissions(Id);
        }

        public void DefaultEditNew()
        {
            throw new NotImplementedException();
        }

        public void DefaultEditNew(Guid Id, string editByType)
        {
            throw new NotImplementedException();
        }

        public void DefaultEditLoad(Guid Id)
        {
            throw new NotImplementedException();
        }

        #endregion
        public const string ObjectTypeGroup = "GROUP";


        //Properties för att hålla reda på om en dialog kan öppnas eller om den redan är öppen i en underliggande dialog
        //-

        //OLIKA ID properties som styr frågan för listan tex om man ska hämta utifrån EmployeeId eller PlanningId
        //Styrs av publika metoder
        public Guid GroupId { get { return ViewState["GroupId"] != null ? (Guid)ViewState["GroupId"] : Guid.Empty; } set { ViewState["GroupId"] = value; } }

        //Olika filter för frågan till listan kan tex vara om man ska visa alla eller aktiva, eller datum mmm
        //Filter sätter man innan man kör de publika metorder som sätter ID properties som finns ovan
        //-

        public List<Guid> GroupFunctionTypes { get { return ViewState["GroupFunctionTypes"] != null ? (List<Guid>)ViewState["GroupFunctionTypes"] : null; } set { ViewState["GroupFunctionTypes"] = value; } }



        #region Init
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack || !InitLoaded)
            {
                InitLoaded = true;
                //Gör sådant som man gör på pageload här typ fyll "statisk" dropdown med värden mm 
                //Väldigt ovanligt att man laddar listan härifrån då det oftast görs via en annan metod se public void LOAD_BY_SOMETHING_LIST(int someval)
            }

        }

        protected override void OnInit(EventArgs e)
        {
            //här gör man alla init inställningar tex lägga till eventhandlers och annat som styr sidan
            //Peka ut dropdown för basklassen
            //-base.ActionDropDown = ddlAction;
            //Peka ut listkontrollen för basklassne
            base.ListControl = lv;
            //Kör om formpart har fler än 1 rad
            //base.SetFormPartHeight(1);

            base.OnInit(e);

            //Event när basklassen behöver listdatat
            base.NeedsData += new NeedsDataHandler(List_NeedsData);


            if (ContainerControl != null)
            {
                //Titel på Caontainerkontrollen
                ContainerControl.Title = "Grupprättigheter";
                //Event vid klick på knapparna i containerkontrollen
                ContainerControl.ButtonsClick += new ButtonsHandler(ContainerControl_ButtonsClick);
                //Vilka knappar som ska visas
                ContainerControl.ShowButtons(true, true, true, false);

                //Om container är en modal dialog
                if (ModalContainerControl != null)
                {
                    ModalContainerControl.Width = 1000;
                    ModalContainerControl.Height = 700;
                    //Event om storlek på modalakontrollen ändras kan användas för att justera storlek på andra element i kontrollen
                    //--ModalContainerControl.FormScrollStyleChanged += new EventHandler(ModalContainerControl_FormScrollStyleChanged);
                }


            }

            //Event när detaljdialogen stänger
            //-


            ListDataBound += new EventHandler<ListViewItemEventArgs>(List_ListDataBound);

        }


        public override void RenderControl(HtmlTextWriter writer)
        {
            if (_LastObjectType != "")
            {
                litEndDispGroupHtml.Text = "</ul></div></div>";

            }

            base.RenderControl(writer);
        }

        /// <summary>
        /// Aktiverar/inaktiverar knappar som behöver data eller som inte kan visas pga underliggande dialoger 
        /// </summary>
        private void ToggleButtons()
        {
            //Sätt status om knappen kan visas pga underliggande dialoger
            //--BaseBL.BtnOpenEnabled(btnNew, CanAddRolePopup, ViewState);
        }

        #endregion
        #region Container Events
        ///// <summary>
        ///// Event när Container ändrar storlek på formscroll
        ///// </summary>
        ///// <param name="sender"></param>
        ///// <param name="e"></param>
        //void ModalContainerControl_FormScrollStyleChanged(object sender, EventArgs e)
        //{
        //    //ListScroll Height sätts automatiskt i basklassen 
        //}

        void List_NeedsData(bool sorting)
        {
            LoadList(sorting);
        }

        /// <summary>
        /// Triggas vid klick på någon av containerkontrollens knappar
        /// </summary>
        /// <param name="sender">Containerkontrollen</param>
        /// <param name="actionType">Vilken typ av knapp som klickats</param>
        void ContainerControl_ButtonsClick(object sender, ActionType actionType)
        {
            if (actionType == ActionType.Save || actionType == ActionType.SaveClose)
            {
                Save();
            }

        }


        #endregion

        #region Events This Control


        #endregion


        #region Control and List methods
        /// <summary>
        /// Här rensas alla id properties som används för frågan till listan
        /// </summary>
        private void ResetIdProperties()
        {
            GroupId = Guid.Empty;
            lv.DataSource = null;
            lv.DataBind();
        }
        /// <summary>
        /// Laddar listan med roller
        /// </summary>
        public void LoadGroupPermissions(Guid groupId)
        {
            ResetIdProperties();
            GroupId = groupId;
            LoadList(true);

        }
        /// <summary>
        /// Nollställ kontrollen och töm listan på värden
        /// </summary>
        public void Clear()
        {
            ResetIdProperties();
        }


        /// <summary>
        /// Metod som ansvarar för att fylla listan med värden utifrån vilken publik load metod som körts innan
        /// </summary>
        /// <param name="sorting">Talar om ifall sortering ska ändras eller om man ska använda tidigare sortering</param>
        private void LoadList(bool sorting)
        {
            InitLoaded = true;

            BIZMAEntities ent = BaseBL.GetEnt();
            lv.DataSource = ent.Security_GetObjectAndSystemFunctions(GroupId);
            lv.DataBind();

            //Alltid storterat på Objtype Name för att det ska skrivas ut riktigt
            //if (!sorting)
            //    lv.ReSort(ViewState);
        }

        private string _LastObjectType = "";
        private int _ObjTypeCount = 0;

        /// <summary>
        /// Event för varje rad som laddas i listan
        /// </summary>
        /// <param name="sender">Listan</param>
        /// <param name="e">ListViewItemEventArgs</param>
        void List_ListDataBound(object sender, ListViewItemEventArgs e)
        {
            Literal litHtml = (Literal)e.Item.FindControl("litDispGroupHtml");
            _CheckBox chkSel = (_CheckBox)e.Item.FindControl("chkSel");

            Guid FunctionId = (Guid)DataBinder.Eval(e.Item.DataItem, "FunctionId");
            string objectType = (string)DataBinder.Eval(e.Item.DataItem, "ObjectType");
            string objectTypeName = (string)DataBinder.Eval(e.Item.DataItem, "ObjectTypeName");
            bool hasFunction = (bool)DataBinder.Eval(e.Item.DataItem, "HasFunction");
            string html = "";


            chkSel.Checked = hasFunction;


            #region ListLayout logic

            if (_ObjTypeCount == 2)
            {
                _ObjTypeCount = 0;
            }

            if (_LastObjectType != objectType)
            {
                //om det inte är första som skrivs ut
                if (_LastObjectType != "")
                {
                    html += "</ul></div>";

                    if (_ObjTypeCount == 0)
                    {
                        html += "</div><div class=\"row\">";
                    }

                    html += "<div class=\"five columns\">";
                    html += "<h3>" + objectTypeName + "</h3>";
                    html += "<ul class=\"block-grid two-up mobile\">";
                }
                else
                {
                    if (_ObjTypeCount == 0)
                    {
                        html += "<div class=\"row\">";
                    }
                    html += "<div class=\"five columns\">";
                    html += "<h3>" + objectTypeName + "</h3>";
                    html += "<ul class=\"block-grid two-up mobile\">";
                }


                litHtml.Text = html;
                _ObjTypeCount += 1;

                _LastObjectType = objectType;

            }
            #endregion



        }


        private void Save()
        {
            BIZMAEntities ent = BaseBL.GetEnt();

            UserGroup group = ent.UserGroups.FirstOrDefault(q => q.UserGroupId == GroupId);

            group.SystemFunctionTypes.Clear();
            group.ObjectFunctionTypes.Clear();
            ent.SaveChanges();

            var selectedKeys = lv.GetSelectedDataKeys("chkSel");
            List<Guid> selectedSFT = new List<Guid>();
            List<Guid> selectedOFT = new List<Guid>();

            foreach (DataKey dk in selectedKeys)
            {
                Guid functionId = (Guid)dk.Values[0];
                string objectType = (string)dk.Values[1];

                if (objectType == SecurityBL.OBJECTTYPE_SYSTEM)
                {
                    selectedSFT.Add(functionId);
                }
                else
                {
                    selectedOFT.Add(functionId);
                }
            }

            if (selectedSFT.Count > 0)
            {
                IQueryable<SystemFunctionTypes> SFTs = ent.SystemFunctionTypes.Where(q => selectedSFT.Contains(q.SystemFunctionTypeId));

                foreach (SystemFunctionTypes SFT in SFTs)
                {
                    group.SystemFunctionTypes.Add(SFT);
                }
            }

            if (selectedOFT.Count > 0)
            {
                IQueryable<ObjectFunctionTypes> OFTs = ent.ObjectFunctionTypes.Where(q => selectedOFT.Contains(q.ObjectFunctionTypeId));

                foreach (ObjectFunctionTypes OFT in OFTs)
                {
                    group.ObjectFunctionTypes.Add(OFT);
                }
            }



            ent.SaveChanges();
        }

        #endregion




    }
}